package com.mvc.controller;

import hbm.DetallePedido;
import hbm.DetallePedidoDAO;
import hbm.Pedidos;
import hbm.PedidosDAO;
import hbm.Marcas;
import hbm.MarcasDAO;
import hbm.Mercaderia;
import hbm.MercaderiaDAO;
import hbm.Sucursal;
import hbm.SucursalDAO;

import hbm.Proveedor;
import hbm.ProveedorDAO;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import dot.WrapperDetallePedido;

public class PedidosController extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	@SuppressWarnings("unchecked")
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String opcion = request.getParameter("opcion");

		if (opcion != null && opcion.equals("pedido")) {
			String boton = request.getParameter("boton");
			if (boton != null && boton.equals("Guardar")) {

				Pedidos pedido = new Pedidos();

				Integer idProveedor = Integer.parseInt(request
						.getParameter("idProv"));
				Proveedor proveedorSeleccionado = new ProveedorDAO()
						.findById(idProveedor);

				String tipoPago = request.getParameter("tipoPago");

				if (tipoPago.equals("0")) {
					pedido.setTipoPago(true);
				}

				Integer idSucursal = Integer.parseInt(request
						.getParameter("idSucursal"));
				Sucursal sucursalSeleccionada = new SucursalDAO()
						.findById(idSucursal);

				pedido.setEstado(true);
				pedido.setProveedor(proveedorSeleccionado);
				pedido.setSucursal(sucursalSeleccionada);

				String fechaPedido = request.getParameter("fecha_p");
				SimpleDateFormat dtTmp = new SimpleDateFormat("yyyy-MM-dd");
				Date fecha;
				try {
					fecha = dtTmp.parse(fechaPedido);
					pedido.setFechaPedido(fecha);
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				Session session = new PedidosDAO().getSession();
				try {
					Transaction tx = session.beginTransaction();
					session.saveOrUpdate(pedido);
					tx.commit();
					session.close();
				} catch (Exception e) {
					// TODO: handle exception
				}
				
				ArrayList<WrapperDetallePedido> listado = new ArrayList<WrapperDetallePedido>();
				for (int k = 0; k < 10; k++) {
					if (!request.getParameter("idMercaderia" + k).equals("")){
						WrapperDetallePedido WDetallePedido = new WrapperDetallePedido();
						WDetallePedido.setIdMercaderia(Integer.parseInt(request
								.getParameter("idMercaderia" + k)));
						WDetallePedido.setCantidad(Integer.parseInt(request
								.getParameter("cantidad" + k)));
						WDetallePedido.setPrecio(Double.parseDouble(request
								.getParameter("precio" + k)));
						listado.add(WDetallePedido);
					}					
				}

				Pedidos pedidoGenerado = new PedidosDAO().findById(pedido.getId());

				for (Iterator iterador = listado.listIterator(); iterador.hasNext();) {
					WrapperDetallePedido detalle = (WrapperDetallePedido) iterador.next();
					Mercaderia mercaderiaSeleccionada = new MercaderiaDAO().findById(detalle.getIdMercaderia());
					DetallePedido detallePedido = new DetallePedido();
					detallePedido.setMercaderia(mercaderiaSeleccionada);
					detallePedido.setCantidad(detalle.getCantidad());
					detallePedido.setPrecioUnitario(new BigDecimal(detalle.getPrecio()));
					detallePedido.setPedidos(pedidoGenerado);
					Session session1 = new DetallePedidoDAO().getSession();
					Transaction tx1 = session1.beginTransaction();

					new DetallePedidoDAO().save(detallePedido);
					try {
						session1.saveOrUpdate(detallePedido);
						tx1.commit();
						session1.close();

					} catch (HibernateException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
			}
			response.sendRedirect("./jsp/listadoPedidos.jsp");
		}


		if (opcion != null && opcion.equals("filtrar")) {
			Integer idProveedor = Integer.parseInt(request
					.getParameter("idProveedor"));
			Proveedor proveedorSeleccionada = new ProveedorDAO()
					.findById(idProveedor);
			request.getSession().setAttribute("idProveedorSeleccionado",
					proveedorSeleccionada.getId());
			request.getSession().setAttribute("nombreProveedorSeleccionada",
					proveedorSeleccionada.getNombre());
			request.getSession().setAttribute("nitProveedorSeleccionada",
					proveedorSeleccionada.getNombre());
			request.getSession().setAttribute("contactoProveedorSeleccionada",
					proveedorSeleccionada.getNombre());
			request.getSession().setAttribute("telefonoProveedorSeleccionada",
					proveedorSeleccionada.getNombre());

			List<Marcas> listaMarcas = new MarcasDAO().findAll();
			List<Mercaderia> listaMercaderia = new MercaderiaDAO().findAll();

			Iterator itr = listaMarcas.listIterator();
			List<Marcas> listaMarcasPorProveedor = new ArrayList<Marcas>();

			if (listaMarcas.size() != 0) {
				while (itr.hasNext()) {
					Marcas m = (Marcas) itr.next();
					if (m.getProveedor().getId() == idProveedor) {
						listaMarcasPorProveedor.add(m);
					}

				}
			}

			Iterator itr2 = listaMercaderia.listIterator();
			Iterator itr3 = listaMarcasPorProveedor.listIterator();
			List<Mercaderia> listaMercaderiaPorMarcas = new ArrayList<Mercaderia>();

			if (listaMercaderia.size() != 0) {
				while (itr3.hasNext()) {
					Marcas m = (Marcas) itr3.next();
					while (itr2.hasNext()) {
						Mercaderia mm = (Mercaderia) itr2.next();
						if (mm.getMarcas().getId() == m.getId()) {
							listaMercaderiaPorMarcas.add(mm);
						}

					}

				}
			}

			List<Sucursal> listaSucursales = new SucursalDAO().findAll();

			request.getSession().setAttribute("listadoMercaderiaPorMarca",
					listaMercaderiaPorMarcas);
			request.getSession().setAttribute("listadoSucursales",
					listaSucursales);
			response.sendRedirect("./jsp/ingresoDetallePedido.jsp");

		}

		if (opcion != null && opcion.equals("listarProveedores")) {
			List<Proveedor> listaProveedor = new ProveedorDAO().findAll();
			request.getSession().setAttribute("listadoProveedores",
					listaProveedor);
			response.sendRedirect("./jsp/ingresoPedido.jsp");
		}

		if (opcion != null && opcion.equals("listar")) {
			List <Pedidos> listaPedidos = new PedidosDAO().findAll();
			request.getSession().setAttribute("listaPedidos", listaPedidos);
			response.sendRedirect("./jsp/listadoPedidos.jsp");
		}
	}

}
